/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

import model.Valoracion;

/**
 *
 * @author Agustin
 */
/**
 *  Clase que ordena un vector de Terminos mediante QuickSort
 *  @author  Agustin de la Roza
 *  @version Mayo 2006
 */
public class Ordenador {

    private Valoracion[] array;

    public Valoracion[] getArray() {
        return array;
    }

    public void setArray(Valoracion[] array) {
        this.array = array;
    }

    public void ordenar() {
        quicksort(0, size() - 1);
    }

    private void quicksort(int i, int j) {
        if (i >= j) {
            return;
        }
        int k = partition(i, j);
        quicksort(i, k - 1);
        quicksort(k + 1, j);
    }

    private int partition(int i, int j) {
        int k = i;
        i++;
        for (;;) {
            while (i < j && compare(i, k) <= 0) {
                i++;
            }
            while (i < j && compare(j, k) >= 0) {
                j--;
            }
            if (i == j) {
                break;
            }
            swap(i, j);
        }
        if (compare(k, i) < 0) {
            i--;
        }
        swap(k, i);
        return i;
    }

    public Ordenador(Valoracion[] array) {
        this.array = array;
    }

    /** intercambia elementos del array
     *@param dos índices de elementos en el arreglo array
     **/
    private void swap(int i, int j) {
        Valoracion x = array[i];
        array[i] = array[j];
        array[j] = x;
    }

    /** Compara dos elementos del array
     *@param dos índices de elementos en el arreglo array
     *@return -1 si el primero es menor que el segundo, 0 si son iguales y 1 si es mayor
     **/
    public int compare(int i, int j) {
        if (array[i].compareTo(array[j]) > 0) {
            return -1;
        } else if (array[i] == array[j]) {
            return 0;
        } else {
            return 1;
        }
    }

    /** devuelve el largo del arreglo
     * @return retorna el número de elementos del arreglo
     **/
    public int size() {
        return array.length;
    }

    /** Imprime el arreglo dado
     **/
    @Override
    public String toString() {
        String aux = "";
        for (int i = 0; i < size(); i++) {
            aux += array[i] + " ";
        }
        return aux;
    }
}
